import fetch from 'dva/fetch';
import constants from '../common/constants';

function parseJSON(response) {
    return response.json();
}

function checkStatus(response) {
    if (response.status >= 200 && response.status < 300) {
        return response;
    }

    const error = new Error(response.statusText);
    error.response = response;
    throw error;
}

/**
 * Requests a URL, returning a promise.
 *
 * @param  {string} url       The URL we want to request
 * @param  {object} [options] The options we want to pass to "fetch"
 * @return {object}           An object containing either "data" or "err"
 */
export default function request(serviceName, methodName, options) {
    const defaultOptions = {
        credentials: 'include',
        method: 'POST',
        version: 'v1',
    };
    const newOptions = {...defaultOptions, ...options};
    const url = constants.apiServer + "/" + newOptions.version + "/" + serviceName + "/" + methodName;
    if (newOptions.method === 'POST' || newOptions.method === 'PUT') {
        newOptions.headers = {
            Accept: 'application/json',
            'Content-Type': 'application/json; charset=utf-8',
            ...newOptions.headers,
        };
        const requestData = {
            serviceName: serviceName,
            methodName: methodName,
            token: '',
            source: 'MOBILE',
            privates: newOptions.body
        };
        newOptions.body = JSON.stringify(requestData);
    }

    // return fetch(url, newOptions)
    //     .then(checkStatus)
    //     .then(response => response.json())
    //     .catch(err => ({err}));

    return fetch(url, newOptions)
        .then(checkStatus)
        .then(parseJSON)
        .then(data => ({data}))
        .catch(err => ({err}));
}
